package com.co.common.entity;

import org.springframework.http.HttpStatus;

/**
 * 结果数据封装
 *
 * @author ldl.plus
 * @version 1.0.0 2020-06-29
 */
public class Result<T> {
    /**
     * 是否成功标识
     */
    private boolean flag = true;

    /**
     * 成功或错误的编码
     */
    private Integer code;

    /**
     * 返回的提示消息
     */
    private String msg = "执行成功";

    /**
     * 返回的数据对象
     */
    private T data;

    /**
     * 返回成功结果数据
     *
     * @return 成功结果数据
     */
    public static <T> Result<T> ok() {
        return buildOkResult("执行成功", null);
    }


    /**
     * 返回成功结果数据
     *
     * @param data 返回数据
     * @return 成功结果数据
     */
    public static <T> Result<T> ok(T data) {
        return buildOkResult("执行成功", data);
    }

    /**
     * 返回成功结果数据
     *
     * @param msg  成功消息
     * @param data 返回数据
     * @return 成功结果数据
     */
    public static <T> Result<T> ok(String msg, T data) {
        return buildOkResult(msg, data);
    }

    /**
     * 返回失败结果数据
     *
     * @return 失败结果数据
     */
    public static <T> Result<T> failed() {
        return buildFailedResult("未知原因异常", null);
    }

    /**
     * 返回失败结果数据
     *
     * @param data 返回数据
     * @return 失败结果数据
     */
    public static <T> Result<T> failed(T data) {
        return buildFailedResult("未知原因异常", data);
    }

    /**
     * 返回失败结果数据
     *
     * @param msg  失败消息
     * @param data 返回数据
     * @return 失败结果数据
     */
    public static <T> Result<T> failed(String msg, T data) {
        return buildFailedResult(msg, data);
    }

    /**
     * 创建成功结果
     *
     * @param msg  成功消息
     * @param data 返回数据
     * @return 结果数据
     */
    private static <T> Result<T> buildOkResult(String msg, T data) {
        Result<T> result = new Result<>();
        return result.setFlag(true).setCode(HttpStatus.OK.value()).setMsg(msg).setData(data);
    }

    /**
     * 创建失败结果
     *
     * @param msg  失败消息
     * @param data 返回数据
     * @return 结果数据
     */
    private static <T> Result<T> buildFailedResult(String msg, T data) {
        Result<T> result = new Result<>();
        return result.setFlag(false).setCode(HttpStatus.PRECONDITION_FAILED.value()).setMsg(msg).setData(data);
    }


    /**
     * 获取是否成功标识
     *
     * @return 是否成功标识
     */
    public boolean getFlag() {
        return flag;
    }

    /**
     * 设置是否成功标识
     *
     * @param flag 是否成功标识
     * @return 结果数据
     */
    public Result<T> setFlag(boolean flag) {
        this.flag = flag;
        return this;
    }

    /**
     * 获取成功或错误的编码
     *
     * @return 成功或错误的编码
     */
    public Integer getCode() {
        return code;
    }

    /**
     * 设置成功或错误的编码
     *
     * @param code 成功或错误的编码
     * @return 结果数据
     */
    public Result<T> setCode(Integer code) {
        this.code = code;
        return this;
    }

    /**
     * 获取返回的提示消息
     *
     * @return 返回的提示消息
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 设置返回的提示消息
     *
     * @param msg 返回的提示消息
     * @return 结果数据
     */
    public Result<T> setMsg(String msg) {
        this.msg = msg;
        return this;
    }

    /**
     * 获取返回的数据对象
     *
     * @return 返回的数据对象
     */
    public T getData() {
        return data;
    }

    /**
     * 设置返回的数据对象
     *
     * @param data 返回的数据对象
     * @return 结果数据
     */
    public Result<T> setData(T data) {
        this.data = data;
        return this;
    }

    @Override
    public String toString() {
        return "Result{" +
                "flag=" + flag +
                ", code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
